// 导入封装的本地持久化方法
import * as auth from '@/utils/auth.js'
// 导入封装的login方法
import { getUserInfo, login, getUserDetailById } from '@/api/user'

import { resetRouter } from '@/router'

export default {
  namespaced: true,
  // 存储数据
  state: {
    token: auth.getToken() || null,
    userInfo: {}
  },
  // 修改数据
  mutations: {
    /**
     * @param {*} state 数据对象
     * @param {*} token 外部调用传入的参数
     */
    // 获取token的存储及删除
    setToken (state, token) {
      state.token = token
      auth.setToken(token)
    },
    delToken (state, token) {
      state.token = null
      auth.removeToken()
    },
    // 获取用户信息的存储及删除
    setUserInfo (state, userInfo) {
      state.userInfo = userInfo
    },
    delUserInfo (state) {
      state.userInfo = {}
    }
  },
  // 异步方法
  actions: {
    // 退出
    /**
     * 1. 后台退出=》调用接口
     * 2. 前端退出=》清除本地数据
     * 3. 重置路由（动态追加路由的缓存）
     * 4. 清除routes模块中菜单数据，只留下静态路由
     */
    logout ({ commit }) {
      commit('delToken')
      commit('delUserInfo')
      resetRouter()
      // commit 只能调用当前模块的mutations方法
      // commit != this.$store.commit()
      // commit('routes/setMenuList', [], { root: true }) === this.$store.commit('routes/setMenuList', [])
      commit('routes/setMenuList', [], { root: true })
    },
    /**
     * context:{
     *   state,       等同于store.$state, 若在模块中则为局部状态
     *   rootState,   等同于store.$state, 只存在模块中
     *   commit,      等同于store.$commit
     *   dispatch,    等同于store.$dispatch
     *   getters      等同于store.$getters
     * }
     * action的函数可以接收一个与store实例具有相同方法的属性context
     * 常规写法调用的时候会使用context.commit，
     * 但更多的是使用es6的变量解构赋值，也就是直接在参数的位置写自己想要的属性，如：{commit}。
     *
     * @param {*} context:{commit:调用mutations方法}
     * @param {*} formData 外界调用传入的参数(手机号,密码)
     */
    async loginAction ({ commit }, formData) {
      // console.log('context输出: ', context)
      const token = await login(formData)
      // console.log('登陆了!', token)
      commit('setToken', token)
    },
    async getUserInfo ({ commit }) {
      const userInfo = await getUserInfo()
      console.log('获取到了权限信息: ', userInfo.roles)
      const userDetail = await getUserDetailById(userInfo.userId)
      // console.log(userDetail)
      commit('setUserInfo', { ...userInfo, ...userDetail })
      return userInfo.roles
    }
  }
}
